<?php
/**
 * Dit is een standaard stuk die in de vacature query's wordt gebruikt ipv
 * steeds dezelfde lap tekst.
 */
function db_BerichtDatumGegevensQuery() {
	return "DATE_FORMAT(v.datum, '%e %b %Y') AS datum, DATEDIFF(CURDATE(), v.datum) AS dagenOud, a.stad AS stad";
}

function db_ReactieDatumGegevensQuery() {
	return "DATE_FORMAT(r.datum, '%e %b %Y') AS datum, DATEDIFF(CURDATE(), r.datum) AS dagenOud, a.stad AS stad";
}

function db_VerkrijgBericht($id) {
    if(!is_numeric($id)) {
        die("Vacature ID is niet numeriek.");
    }
	
    $result = mysql_query("SELECT *, v.id AS v_id, s.id AS s_id
                           FROM berichten v, studenten s, adressen a
                           WHERE v.id = $id AND 
                                 v.student_id = s.id AND
								 a.id = s.adres_id");
    
    $row = mysql_fetch_array($result);
    
    return $row;
}

function db_VerkrijgBerichtReactie($id) {
    if(!is_numeric($id)) {
        die("Vacature ID is niet numeriek.");
    }
	
    $result = mysql_query("SELECT s.voornaam, s.achternaam, s.id AS s_id, r.onderwerp, r.inhoud, r.id AS r_id
                           FROM studenten s, adressen a, reacties r
                           WHERE r.id = $id");
    
    $row = mysql_fetch_array($result);
    
    return $row;
}

/**
 * Verkrijgt de vacature die correnspondeert met het gegeven vacature-id.
 *
 * @param Vacature-id zoals die in de tabel vacatures staat.
 */
function db_VerkrijgOntvangenBerichten($id) {
    if(!is_numeric($id)) {
        die("Vacature ID is niet numeriek.");
    }
	
    $result = mysql_query("SELECT DISTINCT *, v.id AS v_id,
						          ".db_BerichtDatumGegevensQuery()."
                           FROM berichten v, studenten s, adressen a
                           WHERE v.bestemming_id = {$id} AND
								 s.id = v.student_id AND	
								 s.adres_id = a.id
                           ORDER BY v.datum DESC
                           LIMIT 0, 10");
    
    return db_VulArray($result);
}

function db_VerkrijgReactie($id) {
    if(!is_numeric($id)) {
        die("Vacature ID is niet numeriek.");
    }
	
	$result = mysql_query("SELECT DISTINCT *, r.id AS r_id,
						          ".db_ReactieDatumGegevensQuery()."
                           FROM reacties r, adressen a, studenten s
                           WHERE r.student_id = {$id} AND	
								 s.id = r.bestemming_id AND
								 s.adres_id = a.id
                           ORDER BY r.datum DESC
                           LIMIT 0, 10");
						      
    return db_VulArray($result);
}

/**
 * Pakt de laatst geplaatste vacatures uit de dbase, aantal dagen range kun je opgeven; standaard is 7 dagen.
 *
 * @param De verlooptijd in dagen; staat standaard op 7.
 * @returns Tweedimensionale genummerde array, binnenste array is associatief. Gebruik: $array[0]['kolomnaam'].
 */
function db_RecenteVacatures($verloop = 7)
{
    $result = mysql_query("SELECT v.id AS v_id, v.onderwerp, s.voornaam, s.achternaam,
	                              ".db_DatumGegevensQuery()."
                           FROM berichten v, studenten s, adressen a
                           WHERE s.id = v.student_id AND
						         v.datum >= DATE_SUB(CURDATE(), INTERVAL $verloop DAY) AND
								 a.id = s.adres_id
                           ORDER BY v.datum DESC
                           LIMIT 0, 10");
						   
	return db_VulArray($result);
}

/**
 * Pakt vacatures uit de dbase waarop de student gereageerd heeft.
 *
 * @param $id Student-id
 * @returns Tweedimensionale genummerde array, binnenste array is associatief. Gebruik: $array[0]['kolomnaam'].
 */
function db_GereageerdeVacatures($id) {
	$result = mysql_query("SELECT DISTINCT *, v.id AS v_id,
						          ".db_BerichtDatumGegevensQuery()."
                           FROM berichten v, studenten s, adressen a
                           WHERE s.id = {$id} AND
								 s.id = v.student_id AND	
								 s.adres_id = a.id
                           ORDER BY v.datum DESC
                           LIMIT 0, 10");	
						   
	return db_VulArray($result);
}

/**
 * Pakt vacatures uit de dbase die een bedrijf zelf geplaatst heeft.
 *
 * @param Het ID van het bedrijf zoals die in de database staat.
 * @returns Tweedimensionale genummerde array, binnenste array is associatief. Gebruik: $array[0]['kolomnaam'].
 */
function db_EigenVacatures($bedrijf_id) {
	$result = mysql_query("SELECT v.id AS v_id, v.functie, b.naam,
						          ".db_DatumGegevensQuery()."
                           FROM berichten v, bedrijven b, adressen a
                           WHERE b.id = {$bedrijf_id} AND
						         v.bedrijf_id = b.id AND
								 b.adres_id = a.id
                           ORDER BY v.datum DESC
                           LIMIT 0, 10");
						   
	return db_VulArray($result);
}

function db_AantalReacties($v_id) {
	$result = mysql_query("SELECT COUNT(*) FROM reacties r WHERE r.vacature_id = '$v_id'");
	
	$row = mysql_fetch_row($result);
	
	return $row[0];
}

/**
 * Zoek vacatures simpel of uitgebreid.
 *
 * Simpel: $termen wordt gebruikt als string die voor 'functie' staat.
 * Uitgebreid: $termen is een array met 'functie', 'sector', 'opleiding', en 'jaar'.
 *
 * Samenvoeging van de twee losse functies, db_ZoekSimpel en db_ZoekUitgebreid.
 *
 * @param $begin Bij welke opdracht moeten we beginnen met zoeken? (Denk LIMIT)
 * @param $perKeer Hoeveel opdrachten moeten we teruggeven?
 */
function db_Zoeken($termen, $uitgebreid = false, $begin = 0, $perKeer = 15) {
	// Indien $begin en $perKeer geen nummers zijn, stop dan
	if(!is_numeric($begin) && !is_numeric($perKeer)) return;
	
	if(!$uitgebreid) {
		$zoek_query = "v.datum LIKE '%$termen%'";
	} else {
		// SQL Injectie Preventor v.5.234.3.2 - X200ZX-2020:
		// Normaliter geeft foreach een kopie van de elementen in de array, maar
		// & geeft aan dat we de elementen zelf willen hebben (reference), zodat we de array
		// element voor element kunnen veranderen. In dit geval escapen tegen SQL injectie.
		foreach($termen as $term) {
			$term = mysql_real_escape_string($term);
		}
		
		// Als er geen jaar opgegeven is, gebruik dan het hoogste om alle jaren mee te laten tellen
		if($termen['jaar'] == '') { $termen['jaar'] = 4; }
		
		$zoek_query = "v.functie    LIKE '%{$termen['functie']}%'   AND
					   b.sector     LIKE '%{$termen['sector']}%'    AND
					   v.opleiding  LIKE '%{$termen['opleiding']}%'   AND
					   v.jaar       <=   '{$termen['jaar']}'";
	}
	
	$query = "SELECT SQL_CALC_FOUND_ROWS v.id, s.voornaam, s.achternaam, v.onderwerp,
						  ".db_DatumGegevensQuery()."
				   FROM berichten v, studenten s, adressen a
				   WHERE v.student_id = s.id AND 
						 s.adres_id = a.id AND 
						 (%zoek%)
				   ORDER BY v.datum DESC
				   LIMIT $begin, $perKeer";
						   
	$query = str_replace('%zoek%', $zoek_query, $query);
    
    $result = mysql_query($query);
	$vacatures =  db_VulArray($result);
    
	/* Het volgende is om de totale hoeveelheid rijen die de query oplevert terug te krijgen
	 * want door de LIMIT clause komen er maximaal maar 15 door.
	 * SQL_CALC_FOUND_ROWS doet wat rekenwerk voor ons zodat we niet de query twee keer hoeven
	 * te herhalen. Met een SELECT FOUND_ROWS() krijgen we het totaal die net uitgerekend is.
	 */
	$result = mysql_query("SELECT FOUND_ROWS()");
	$totaal = mysql_fetch_row($result);
	
	// We stoppen het resultaat van deze berekening tussen de rest van de vacatures.
	$vacatures['totaal'] = $totaal[0];
	
	return $vacatures;
}


/**
 * Pakt de laatste (standaard) 5 nieuwsberichten.
 *
 * @param integer limiet Maximum aantal berichten
 * @returns array Tweedimensionale genummerde array, binnenste array is associatief.
 */
function db_Nieuws($limiet = 5) {
    $result = mysql_query("SELECT titel, tekst, DATE_FORMAT(datum, '%e %b %Y - %H:%i') AS datum 
                           FROM nieuws
                           ORDER BY datum DESC
                           LIMIT 0, $limiet");
    
	return db_VulArray($result);
}

/**
 * Kijkt of de gegeven email en wachtwoordhash overeenkomen met iemand in de database (student of bedrijf).
 *
 * @param string Email
 * @param string Wachtwoord, wordt gehashed met md5() en vergeleken.
 * @return integer ID nummer waarmee de gebruiker ingeschreven staat, anders False.
 */
function db_GebruikerBestaat($email, $ww, $md5pass = false) {
	// Voorkom SQL injectie (zoveel mogelijk)
	$email = mysql_real_escape_string($email);
	
	$result = mysql_query("SELECT password, id FROM studenten WHERE email = '$email'");

	$row = mysql_fetch_array($result);
	
	// Als er geen resultaten zijn: user is niet ingeschreven
	if(mysql_num_rows($result) == 0) {
		return false;
		
	// De user bestaat, check wachtwoord
	} else if(mysql_num_rows($result) == 1) {
	
		// Password is in md5 vorm gegeven
		if($md5pass) {
			if($ww      == $row['password'])
				return $row['id'];
		// Password is plaintext
		} else {
			if(md5($ww) == $row['password'])
				return $row['id'];
		}
			
		// Helaas, wachtwoord klopt niet
		} else {
			return false;
		}
	}

/**
 * Kijkt of een vacature-id bestaat.
 *
 * @returns boolean True indien vacature bestaat, anders False.
 */
function db_VacatureBestaat($id) {
	$result = mysql_query("SELECT id FROM berichten WHERE id = '$id'");
	
	$row = mysql_fetch_array($result);
	
	// Als er geen resultaten zijn: vacature bestaat niet
	if(mysql_num_rows($result) <= 0) {
		return false;
	} else {
		return true;
	}
}

function db_ReactieBestaat($id) {
	$result = mysql_query("SELECT id FROM reacties WHERE id = '$id'");
	
	$row = mysql_fetch_array($result);
	
	// Als er geen resultaten zijn: vacature bestaat niet
	if(mysql_num_rows($result) <= 0) {
		return false;
	} else {
		return true;
	}
}

/**
 * Haalt het volledige profiel van een student met het gegeven ID op.
 *
 * @param integer ID van de student zoals die in de kolom studenten.id staat.
 * @returns array Tweedimensionale genummerde array, binnenste array is associatief. Dag, maand en jaar zijn te vinden
 * onder 'gdag', 'gmaand', 'gjaar'.
 */
function db_StudentProfiel($id) {
	$result = mysql_query("SELECT *, DAY(geboortedatum) AS gdag, MONTH(geboortedatum) AS gmaand, YEAR(geboortedatum) AS gjaar, s.id AS id
	                       FROM studenten s, adressen a
						   WHERE s.id = $id AND s.adres_id = a.id");
						   
	$rows = mysql_fetch_array($result);
	
	return $rows;
}

function db_StudentReactie($r_id, $s_id) {
	$result = mysql_query("SELECT s.id, s.voornaam, s.achternaam, r.id AS r_id, r.student_id, r.onderwerp, r.inhoud FROM studenten s, reacties r
						   WHERE r.id = '$r_id' AND s.id = r.student_id");
						   
	$rows = mysql_fetch_array($result);
	
	return $rows;
}
/**
 * Haalt het volledige profiel van een bedrijf met het gegeven ID op.
 *
 * @param integer ID van de student zoals die in de kolom studenten.id staat.
 * @returns array Tweedimensionale genummerde array, binnenste array is associatief. Dag, maand en jaar zijn te vinden
 * onder 'gdag', 'gmaand', 'gjaar'.
 */
function db_BedrijfProfiel($id) {
	$result = mysql_query("SELECT *
	                       FROM bedrijven s, adressen a
						   WHERE s.id = $id AND s.adres_id = a.id");
						   
	$rows = mysql_fetch_array($result);
	
	return $rows;
}

function db_VerkrijgReacties($id) {
	$result = mysql_query("SELECT DISTINCT s.voornaam, s.achternaam, s.id AS s_id, r.id AS r_id,
	                              DATE_FORMAT(r.datum, '%e %b %Y - %H:%i') AS datum,
								  DATEDIFF(CURDATE(), r.datum) AS dagenOud FROM studenten s, reacties r, berichten v
						   WHERE s.id = r.student_id AND
						         r.vacature_id = '$id'
						   ORDER BY r.datum DESC");
							 
	return db_VulArray($result);
}

function db_StudentHeeftGereageerd($s_id, $v_id) {
	$result = mysql_query("SELECT s.id FROM reacties r, studenten s
						   WHERE r.student_id = '$s_id' AND
						         r.vacature_id = '$v_id'");
	
	$row = mysql_fetch_array($result);
	
	// Als er geen resultaten zijn: stjudent heeft niet gereageerd op deze vacature
	if(mysql_num_rows($result) <= 0) {
		return false;
	} else {
		return true;
	}
}

/**
 * Rauwe toegang tot de database met zelfgemaakte queries.
 *
 * Wordt vooral gebruikt bij de administratie-modules.
 * @param string Volledige query om uit te voeren.
 * @returns array Tweedimensionale genummerde array, binnenste array is associatief.
 */
function db_Query($query) {
	$result = mysql_query($query);
	
	return db_VulArray($result);
}
?>